/**
 * encrypt.c - 简单的加密/解密工具函数
 *
 * 此文件实现了用于演示目的的基本加密/解密函数。
 * 在实际应用场景中，这些函数会使用正规的加密库。
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <time.h>

#include "../../include/hook_framework.h"

/* 全局加密密钥 - 在实际实现中，这会从安全源加载 */
static uint8_t g_key[16] = {0};
static int g_key_initialized = 0;

/**
 * 初始化加密密钥
 * 在实际实现中，这会从安全源加载
 */
static void ensure_key_initialized(void) {
    if (g_key_initialized) {
        return;
    }
    
    /* 检查环境中是否提供了密钥 */
    const char* env_key = getenv("HOOK_ENCRYPTION_KEY");
    if (env_key && strlen(env_key) >= 16) {
        /* 使用环境密钥的前16个字节 */
        memcpy(g_key, env_key, 16);
    } else {
        /* 为演示目的使用硬编码密钥 */
        const char* default_key = "HookFrameworkKey";
        memcpy(g_key, default_key, 16);
    }
    
    g_key_initialized = 1;
    
    /* 记录我们已经初始化，但不记录实际密钥 */
    log_message(LOG_INFO, "加密密钥已初始化");
}

/**
 * 使用简单的XOR密码加密缓冲区
 * 
 * 这是一个非常基础的加密方式，仅供演示。
 * 实际实现中会使用适当的加密算法。
 * 
 * @param buf  要加密的缓冲区（就地修改）
 * @param len  缓冲区的长度
 */
void encrypt_buffer(void* buf, size_t len) {
    /* 确保密钥已初始化 */
    ensure_key_initialized();
    
    /* 如果调试已启用，记录我们正在做什么 */
    log_message(LOG_DEBUG, "正在加密大小为%zu的缓冲区", len);
    
    /* 应用XOR加密 */
    uint8_t* data = (uint8_t*)buf;
    for (size_t i = 0; i < len; i++) {
        data[i] ^= g_key[i % sizeof(g_key)];
    }
}

/**
 * 解密缓冲区（使用相同的XOR密码）
 * 
 * 由于XOR是对称的，加密和解密使用相同的操作。
 * 
 * @param buf  要解密的缓冲区（就地修改）
 * @param len  缓冲区的长度
 */
void decrypt_buffer(void* buf, size_t len) {
    /* 确保密钥已初始化 */
    ensure_key_initialized();
    
    /* 如果调试已启用，记录我们正在做什么 */
    log_message(LOG_DEBUG, "正在解密大小为%zu的缓冲区", len);
    
    /* 应用XOR解密（与加密相同） */
    encrypt_buffer(buf, len);
}

/**
 * 设置自定义加密密钥
 * 
 * @param key  要使用的新密钥
 * @param len  密钥的长度（最多使用16字节）
 */
void set_encryption_key(const void* key, size_t len) {
    size_t copy_len = len > sizeof(g_key) ? sizeof(g_key) : len;
    
    memset(g_key, 0, sizeof(g_key));
    if (key && copy_len > 0) {
        memcpy(g_key, key, copy_len);
    }
    
    g_key_initialized = 1;
    log_message(LOG_INFO, "已设置自定义加密密钥");
}

/**
 * 库加载时初始化密钥
 */
__attribute__((constructor))
static void init_encryption(void) {
    ensure_key_initialized();
}
